<?php

/**
 * \file
 * Classe `Redirection`.
 */

namespace pilar\Redirections /* \cond */ ; /* \endcond */
{

/**
 * Redirection.
 *
 * \since 10/04/2009
 * \author Dirk MARSKI <dirk.marski@gmail.com>
 */
class Redirection extends \object {


/**
 * Lien de la redirection.
 * Du type \pilar\Links\Link.
 */
private $_link = null;


/**
 * Stocke si la redirection a été construite.
 */
private $_built = false;


/**
 * Containeur dans le quel est inséré la redirection.
 * Hérite obligatoirement de \pilar\Blocks\Block.
 */
private $_container = null;


protected function loadDefaultParams() {
 parent::loadDefaultParams();
 $this->params->define(array(
  'name' => '', // Nom (sert en tant qu'identifiant).
  'label' => '', // Libellé.
  'redirection' => '' // redirection, soit type, soit lien. 
 ));
}


/**
 * Permet de donner un lien externe pour la redirection.
 * 
 * \param $link Lien en question.
 * \since 22/06/2009
 */
public function setLink($link) {
 $this->_link = $link;
}


/**
 * Donne le containeur de la redirection.
 * Par exemple un bloc ou un formulaire.
 *
 * \param $container Containeur qui doit hériter de \pilar\Blocks\Block.
 */
public function setContainer($container) {
 $this->_container = $container;
}


/**
 * Fonction qui charge le paramètre de redirection.
 *
 * \param $redirection \see redirect().
 * \since 10/04/2009
 */
protected function buildRedirection($redirection) {
 if ($this->_container != null && $this->_container
            ->postVarValue('_redirection_'.$this->get('name').'_value') != '') {
  $this->_link = new \pilar\Links\Link(array(
   'target' => $this->_container
                  ->postVarValue('_redirection_'.$this->get('name').'_value')));
 }

 $this->buildRedirectionRoot($redirection);
 $this->_built = true;
}


/**
 * Racine de la redirection pour l'adapter.
 * On met à disposition deux cas 'standard' pour éviter d'écrire le
 * même code trop souvent.
 * On a la possibilité de soit faire un retour à la page précédente,
 * soit recharger la même page.
 * Le choix se fait via le paramètre 'typicalRedirection'. 
 *
 * \param $redirection \see redirect().
 * \since 29/03/2009
 */
protected function buildRedirectionRoot($redirection) {
 // Alias de code :
  $redirectionParam = $this->param('redirection');
 
 if ($this->_link == null) {
  if ($redirectionParam == 'getBack' || $redirection == 'getBack') {
   $link = new \pilar\Links\Link(array('specificLink' => 'refererUri'));
  } else if ($redirectionParam == 'reload' || $redirection == 'reload') {
   $link = new \pilar\Links\Link(array('specificLink' => 'requestUri'));
  } else if ($redirectionParam == '') {
   $link = new \pilar\Links\Link(array('target' => $redirection));
  } else {
   $link = new \pilar\Links\Link(array('target' => $redirectionParam));
  }
  $this->_link = $link;
 }
}


/**
 * Redirection de la page. Attention, le script est coupé dans cette
 * fonction.
 *
 *  \param $redirection Peut être une redirection typique, ou une
 * adresse entière. Celle-ci aura la priorité sur 'redirection' e
 * 'typicalRedirection'.
 */
public function redirect($redirection = '') {
 if (!$this->_built) {
  $this->buildRedirection($redirection);
 }
 
 if (PILAR_ENABLE_REDIRECT && $this->_link != null) {
  // On donne la main à une fonction extérieure pour effectuer des actions si
  // souhaité :
  if (PILAR_REDIRECTION_INSTRUCTIONS_BEFORE_EXIT != '') {
   include(PILAR_REDIRECTION_INSTRUCTIONS_BEFORE_EXIT);
  }

  header('location:'.$this->_link->getLinkAsString());
  exit;
 }
}


/**
 * Fonction qui ajoute la redirection dans un champ caché.
 * Uniquement valable si le containeur est un formulaire.
 *
 * \since 29/03/2009
 */
final public function append() {
 if ($this->_container != null) {
  if (!$this->_built) {
   $this->buildRedirection('');
  }
  // Ajout de la redirection en hidden si elle existe :
   if ($this->_link != null) {
    $redirection = new \pilar\SimpleFormMembers\TextBox(array(
     'name' => '_redirection_'.$this->param('name'),
     'hidden' => true
    ));
    
    $redirection->value = $this->_link->getLinkAsString();
    $this->_container->appendAtom($redirection);
  }
 }
}


} // Class.

} // Namespace.
